package com.wang.printer;

import com.wang.model.ApiInfo;
import com.wang.model.CallChain;

import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 结果输出器：格式化并展示调用链分析结果
 */
public class ResultPrinter {
    private final Map<CallChain, Set<ApiInfo>> impactResults;  // 分析结果
    private final String targetMethodName;  // 目标方法名

    public ResultPrinter(Map<CallChain, Set<ApiInfo>> impactResults, String targetMethodName) {
        this.impactResults = impactResults;
        this.targetMethodName = targetMethodName;
    }

    /**
     * 打印分析结果
     */
    public void print() {
        System.out.println("\n=== 反向调用链追踪分析结果 ===");
        System.out.println("目标方法: " + targetMethodName);
        System.out.println("发现调用链数量: " + impactResults.size());
        System.out.println();

        if (impactResults.isEmpty()) {
            printEmptyResult();
            return;
        }

        printCallChains();  // 打印调用链详情
        printSummary();     // 打印统计信息
    }

    /**
     * 打印所有调用链及其影响的接口
     */
    private void printCallChains() {
        int chainIndex = 1;
        for (Map.Entry<CallChain, Set<ApiInfo>> entry : impactResults.entrySet()) {
            CallChain chain = entry.getKey();
            Set<ApiInfo> apis = entry.getValue();

            System.out.println("📋 调用链 #" + chainIndex + ":");
            System.out.println("   调用路径: " + chain.getChainText());
            System.out.println("   影响的接口:");

            apis.forEach(api -> System.out.println("     🔗 " + api));
            System.out.println();
            chainIndex++;
        }
    }

    /**
     * 打印统计摘要信息
     */
    private void printSummary() {
        // 计算总接口数
        int totalApis = impactResults.values().stream()
                .mapToInt(Set::size)
                .sum();

        // 收集所有去重的受影响接口
        Set<ApiInfo> allAffectedApis = impactResults.values().stream()
                .flatMap(Set::stream)
                .collect(Collectors.toSet());

        System.out.println("📊 统计信息:");
        System.out.println("   调用链总数: " + impactResults.size());
        System.out.println("   受影响接口总数: " + totalApis);

        System.out.println("\n🎯 所有受影响的接口列表:");
        allAffectedApis.forEach(api -> System.out.println("   " + api));
    }

    /**
     * 当没有找到调用链时打印提示
     */
    private void printEmptyResult() {
        System.out.println("❌ 未找到任何调用链，可能的原因：");
        System.out.println("   1. 目标方法不存在或名称不匹配");
        System.out.println("   2. 没有Controller方法调用该目标方法");
        System.out.println("   3. 项目路径或包名配置不正确");
    }
}
